//
// Created by 孙代宇 on 2021/12/3.
//

#ifndef UNTITLED2_LINKEDLIST_H
#define UNTITLED2_LINKEDLIST_H

#include "stdio.h"
#include "stdlib.h"

class LinkedList {
public:
    typedef struct LNode {
        int value;
        struct LNode *next;
    } LNode, *LinkedLists;
    LinkedLists list;

    // 初始化带头链表
    bool InitLinkedList(LinkedLists &L) {
        L = (LNode *) malloc(sizeof(LNode));
        if (L == NULL) return false;
        L->next = NULL;
        return true;
    }

    // 链表后插入
    bool ListInsert(LinkedLists &L, int element, int i) {
        LNode *p = L;

        // 位置合法
        if (i < 1) return false;

        // 让p指向需要插入的位置
        while (i > 1 && p != NULL) {
            p = p->next;
            i--;
        }
        if (p == NULL) return false;
        // 开辟新的空间
        LNode *insertList = (LNode *) malloc(sizeof(LNode));

        // 赋值
        insertList->value = element;

        // 把p的下一个指针指向新的指针的下一个指针
        insertList->next = p->next;

        // 让p的下一个指针指向新的指针
        p->next = insertList;

        return true;
    }

    // 指定索引前插入
    bool ListInsertBefore(LinkedLists &L, int element, int i) {
        LNode *p = L;

        if (i < 1) return false;

        while (i > 0 && p != NULL) {
            p = p->next;
            i--;
        }

        if (p == NULL) return false;

        LNode *insertList = (LNode *) malloc(sizeof(LNode));

        insertList->next = p->next;
        p->next = insertList;
        int temp = p->value;
        p->value = element;
        insertList->value = temp;
        return true;
    }

    bool GetElements(LinkedLists L) {

        // 空判断
        if (L->next == NULL) return false;

        // 指向下一个指针
        LNode *p = L->next;

        // 当前指针不为空 则一直next
        while (p != NULL) {
            printf("%d\n", p->value);
            p = p->next;
        }
        return true;
    }
};

#endif //UNTITLED2_LINKEDLIST_H
